package com.ruoyi.demowechatpay.pojo.dto;

import com.github.binarywang.wxpay.bean.merchanttransfer.TransferCreateRequest;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.v3.SpecEncrypt;
import com.google.gson.annotations.SerializedName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.List;

/**
 * MyTransferCreateRequest
 *
 * @author huajiao
 * @date 2025/3/27 10:29
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class MyTransferCreateRequest implements Serializable {
    private static final long serialVersionUID = -6865437704112740902L;
    /**
     * <pre>
     * 字段名：直连商户的appid
     * 变量名：appid
     * 是否必填：是
     * 类型：string[1,32]
     * 描述：
     *  申请商户号的appid或商户号绑定的appid（企业号corpid即为此appid）
     * 示例值：wxf636efh567hg4356
     * </pre>
     */
    @SerializedName("appid")
    private String appid;

    /**
     * 【商户单号】 商户系统内部的商家单号，要求此参数只能由数字、大小写字母组成，在商户系统内部唯一
     */
    @SerializedName("out_bill_no")
    private String outBillNo;

    /**
     * <pre>
     * 字段名：转账场景ID
     * 变量名：transfer_scene_id
     * 是否必填：否
     * 类型：string(36)
     * 描述：
     *  该批次转账使用的转账场景，如不填写则使用商家的默认场景，如无默认场景可为空，可前往“商家转账到零钱-前往功能”中申请。
     * 示例值：1001
     * </pre>
     */
    @SerializedName("transfer_scene_id")
    private String transferSceneId;

    /**
     * <pre>
     * 字段名：用户在直连商户应用下的用户标示
     * 变量名：openid
     * 是否必填：是
     * 类型：string[1,128]
     * 描述：
     *  用户在直连商户appid下的唯一标识
     * 示例值：o-MYE42l80oelYMDE34nYD456Xoy
     * </pre>
     */
    @SerializedName("openid")
    private String openid;

    /**
     * <pre>
     * 字段名：收款用户姓名
     * 变量名：user_name
     * 是否必填：否
     * 类型：string[1,1024]
     * 描述：
     *  1、商户转账时传入了收款用户姓名、查询时会返回收款用户姓名；
     * 2、收款方姓名采用标准RSA算法，公钥由微信侧提供
     * 3、 该字段需进行加密处理，加密方法详见敏感信息加密说明。(提醒：必须在HTTP头中上送Wechatpay-Serial)
     * 示例值：757b340b45ebef5467rter35gf464344v3542sdf4t6re4tb4f54ty45t4yyry45
     * </pre>
     */
    @SerializedName("user_name")
    @SpecEncrypt
    private String userName;

    /**
     * <pre>
     * 字段名：转账金额
     * 变量名：transfer_amount
     * 是否必填：是
     * 类型：int
     * 描述：
     *  转账金额单位为分
     * 示例值：200000
     * </pre>
     */
    @SerializedName("transfer_amount")
    private Integer transferAmount;

    /**
     * <pre>
     * 字段名：转账备注
     * 变量名：transfer_remark
     * 是否必填：是
     * 类型：string[1,32]
     * 描述：
     *  单条转账备注（微信用户会收到该备注），UTF8编码，最多允许32个字符
     * 示例值：2020年4月报销
     * </pre>
     */
    @SerializedName("transfer_remark")
    private String transferRemark;

    /**
     * <pre>
     * 字段名：通知地址
     * 变量名：notify_url
     * 是否必填：否
     * 类型：string(256)
     * 描述：
     *  异步接收微信支付结果通知的回调地址，通知url必须为公网可访问的url，必须为https，不能携带参数。
     * 回调解析: {@link WxPayService#parseTransferBatchesNotifyV3Result}
     * </pre>
     */
    @SerializedName("notify_url")
    private String notifyUrl;

    /**
     * 【用户收款感知】 用户收款时感知到的收款原因将根据转账场景自动展示默认内容。如有其他展示需求，可在本字段传入。各场景展示的默认内容和支持传入的内容，可查看产品文档了解。
     * 示例：现金奖励
     */
    @SerializedName("user_recv_perception")
    private String userRecvPerception;


    /**
     * 【转账场景报备信息】 各转账场景下需报备的内容，商户需要按照所属转账场景规则传参，详见转账场景报备信息字段说明。
     * https://pay.weixin.qq.com/doc/v3/merchant/4013774588
     *
     * "transfer_scene_report_infos" :  [{
     *     "info_type" :   "活动名称",
     *     "info_content" : "新会员有礼"
     * },{
     *     "info_type" : "奖励说明",
     *     "info_content" : "注册会员抽奖一等奖"
     * }]
     */
    @SerializedName("transfer_scene_report_infos")
    @SpecEncrypt
    private List<TransferSceneReportInfo> transferSceneReportInfos;

    public String getAppid() {
        return appid;
    }

    public void setAppid(String appid) {
        this.appid = appid;
    }

    public String getOutBillNo() {
        return outBillNo;
    }

    public void setOutBillNo(String outBillNo) {
        this.outBillNo = outBillNo;
    }

    public String getTransferSceneId() {
        return transferSceneId;
    }

    public void setTransferSceneId(String transferSceneId) {
        this.transferSceneId = transferSceneId;
    }

    public String getOpenid() {
        return openid;
    }

    public void setOpenid(String openid) {
        this.openid = openid;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Integer getTransferAmount() {
        return transferAmount;
    }

    public void setTransferAmount(Integer transferAmount) {
        this.transferAmount = transferAmount;
    }

    public String getTransferRemark() {
        return transferRemark;
    }

    public void setTransferRemark(String transferRemark) {
        this.transferRemark = transferRemark;
    }

    public String getNotifyUrl() {
        return notifyUrl;
    }

    public void setNotifyUrl(String notifyUrl) {
        this.notifyUrl = notifyUrl;
    }

    public String getUserRecvPerception() {
        return userRecvPerception;
    }

    public void setUserRecvPerception(String userRecvPerception) {
        this.userRecvPerception = userRecvPerception;
    }

    public List<TransferSceneReportInfo> getTransferSceneReportInfos() {
        return transferSceneReportInfos;
    }

    public void setTransferSceneReportInfos(List<TransferSceneReportInfo> transferSceneReportInfos) {
        this.transferSceneReportInfos = transferSceneReportInfos;
    }

    /**
     * The type Transfer detail list.
     */
    @Data
    @Accessors(chain = true)
    public static class TransferSceneReportInfo implements Serializable {

        /**
         * 【信息类型】 不能超过15个字符，商户所属转账场景下的信息类型，此字段内容为固定值，需严格按照转账场景报备信息字段说明传参。
         */
        @SerializedName("info_type")
        private String infoType;
        /**
         * 【信息内容】 不能超过32个字符，商户所属转账场景下的信息内容，商户可按实际业务场景自定义传参，需严格按照转账场景报备信息字段说明传参。
         */
        @SerializedName("info_content")
        private String infoContent;


        public String getInfoContent() {
            return infoContent;
        }

        public void setInfoContent(String infoContent) {
            this.infoContent = infoContent;
        }

        public String getInfoType() {
            return infoType;
        }

        public void setInfoType(String infoType) {
            this.infoType = infoType;
        }
    }
}
